
#define BLINK  P1OUT^= BIT0;	// Toggle LED

#define PIN_SCE   10
#define PIN_RESET 9
#define PIN_DC    8
#define PIN_SDIN  7
#define PIN_SCLK  6
#define PIN_LED  5

#define LCD_C     LOW
#define LCD_D     HIGH

#define LCD_X     84
#define LCD_Y     48


static const byte ASCII[][5] =
{
  {
    0x00, 0x00, 0x00, 0x00, 0x00          } // 20  
  ,{
    0x00, 0x00, 0x5f, 0x00, 0x00          } // 21 !
  ,{
    0x00, 0x07, 0x00, 0x07, 0x00          } // 22 "
  ,{
    0x14, 0x7f, 0x14, 0x7f, 0x14          } // 23 #
  ,{
    0x24, 0x2a, 0x7f, 0x2a, 0x12          } // 24 0x
  ,{
    0x23, 0x13, 0x08, 0x64, 0x62          } // 25 %
  ,{
    0x36, 0x49, 0x55, 0x22, 0x50          } // 26 &
  ,{
    0x00, 0x05, 0x03, 0x00, 0x00          } // 27 '
  ,{
    0x00, 0x1c, 0x22, 0x41, 0x00          } // 28 (
  ,{
    0x00, 0x41, 0x22, 0x1c, 0x00          } // 29 )
  ,{
    0x14, 0x08, 0x3e, 0x08, 0x14          } // 2a *
  ,{
    0x08, 0x08, 0x3e, 0x08, 0x08          } // 2b +
  ,{
    0x00, 0x50, 0x30, 0x00, 0x00          } // 2c ,
  ,{
    0x08, 0x08, 0x08, 0x08, 0x08          } // 2d -
  ,{
    0x00, 0x60, 0x60, 0x00, 0x00          } // 2e .
  ,{
    0x20, 0x10, 0x08, 0x04, 0x02          } // 2f /
  ,{
    0x3e, 0x51, 0x49, 0x45, 0x3e          } // 30 0
  ,{
    0x00, 0x42, 0x7f, 0x40, 0x00          } // 31 1
  ,{
    0x42, 0x61, 0x51, 0x49, 0x46          } // 32 2
  ,{
    0x21, 0x41, 0x45, 0x4b, 0x31          } // 33 3
  ,{
    0x18, 0x14, 0x12, 0x7f, 0x10          } // 34 4
  ,{
    0x27, 0x45, 0x45, 0x45, 0x39          } // 35 5
  ,{
    0x3c, 0x4a, 0x49, 0x49, 0x30          } // 36 6
  ,{
    0x01, 0x71, 0x09, 0x05, 0x03          } // 37 7
  ,{
    0x36, 0x49, 0x49, 0x49, 0x36          } // 38 8
  ,{
    0x06, 0x49, 0x49, 0x29, 0x1e          } // 39 9
  ,{
    0x00, 0x36, 0x36, 0x00, 0x00          } // 3a :
  ,{
    0x00, 0x56, 0x36, 0x00, 0x00          } // 3b ;
  ,{
    0x08, 0x14, 0x22, 0x41, 0x00          } // 3c <
  ,{
    0x14, 0x14, 0x14, 0x14, 0x14          } // 3d =
  ,{
    0x00, 0x41, 0x22, 0x14, 0x08          } // 3e >
  ,{
    0x02, 0x01, 0x51, 0x09, 0x06          } // 3f ?
  ,{
    0x32, 0x49, 0x79, 0x41, 0x3e          } // 40 @
  ,{
    0x7e, 0x11, 0x11, 0x11, 0x7e          } // 41 A
  ,{
    0x7f, 0x49, 0x49, 0x49, 0x36          } // 42 B
  ,{
    0x3e, 0x41, 0x41, 0x41, 0x22          } // 43 C
  ,{
    0x7f, 0x41, 0x41, 0x22, 0x1c          } // 44 D
  ,{
    0x7f, 0x49, 0x49, 0x49, 0x41          } // 45 E
  ,{
    0x7f, 0x09, 0x09, 0x09, 0x01          } // 46 F
  ,{
    0x3e, 0x41, 0x49, 0x49, 0x7a          } // 47 G
  ,{
    0x7f, 0x08, 0x08, 0x08, 0x7f          } // 48 H
  ,{
    0x00, 0x41, 0x7f, 0x41, 0x00          } // 49 I
  ,{
    0x20, 0x40, 0x41, 0x3f, 0x01          } // 4a J
  ,{
    0x7f, 0x08, 0x14, 0x22, 0x41          } // 4b K
  ,{
    0x7f, 0x40, 0x40, 0x40, 0x40          } // 4c L
  ,{
    0x7f, 0x02, 0x0c, 0x02, 0x7f          } // 4d M
  ,{
    0x7f, 0x04, 0x08, 0x10, 0x7f          } // 4e N
  ,{
    0x3e, 0x41, 0x41, 0x41, 0x3e          } // 4f O
  ,{
    0x7f, 0x09, 0x09, 0x09, 0x06          } // 50 P
  ,{
    0x3e, 0x41, 0x51, 0x21, 0x5e          } // 51 Q
  ,{
    0x7f, 0x09, 0x19, 0x29, 0x46          } // 52 R
  ,{
    0x46, 0x49, 0x49, 0x49, 0x31          } // 53 S
  ,{
    0x01, 0x01, 0x7f, 0x01, 0x01          } // 54 T
  ,{
    0x3f, 0x40, 0x40, 0x40, 0x3f          } // 55 U
  ,{
    0x1f, 0x20, 0x40, 0x20, 0x1f          } // 56 V
  ,{
    0x3f, 0x40, 0x38, 0x40, 0x3f          } // 57 W
  ,{
    0x63, 0x14, 0x08, 0x14, 0x63          } // 58 X
  ,{
    0x07, 0x08, 0x70, 0x08, 0x07          } // 59 Y
  ,{
    0x61, 0x51, 0x49, 0x45, 0x43          } // 5a Z
  ,{
    0x00, 0x7f, 0x41, 0x41, 0x00          } // 5b [
  ,{
    0x02, 0x04, 0x08, 0x10, 0x20          } // 5c ¥
  ,{
    0x00, 0x41, 0x41, 0x7f, 0x00          } // 5d ]
  ,{
    0x04, 0x02, 0x01, 0x02, 0x04          } // 5e ^
  ,{
    0x40, 0x40, 0x40, 0x40, 0x40          } // 5f _
  ,{
    0x00, 0x01, 0x02, 0x04, 0x00          } // 60 `
  ,{
    0x20, 0x54, 0x54, 0x54, 0x78          } // 61 a
  ,{
    0x7f, 0x48, 0x44, 0x44, 0x38          } // 62 b
  ,{
    0x38, 0x44, 0x44, 0x44, 0x20          } // 63 c
  ,{
    0x38, 0x44, 0x44, 0x48, 0x7f          } // 64 d
  ,{
    0x38, 0x54, 0x54, 0x54, 0x18          } // 65 e
  ,{
    0x08, 0x7e, 0x09, 0x01, 0x02          } // 66 f
  ,{
    0x0c, 0x52, 0x52, 0x52, 0x3e          } // 67 g
  ,{
    0x7f, 0x08, 0x04, 0x04, 0x78          } // 68 h
  ,{
    0x00, 0x44, 0x7d, 0x40, 0x00          } // 69 i
  ,{
    0x20, 0x40, 0x44, 0x3d, 0x00          } // 6a j 
  ,{
    0x7f, 0x10, 0x28, 0x44, 0x00          } // 6b k
  ,{
    0x00, 0x41, 0x7f, 0x40, 0x00          } // 6c l
  ,{
    0x7c, 0x04, 0x18, 0x04, 0x78          } // 6d m
  ,{
    0x7c, 0x08, 0x04, 0x04, 0x78          } // 6e n
  ,{
    0x38, 0x44, 0x44, 0x44, 0x38          } // 6f o
  ,{
    0x7c, 0x14, 0x14, 0x14, 0x08          } // 70 p
  ,{
    0x08, 0x14, 0x14, 0x18, 0x7c          } // 71 q
  ,{
    0x7c, 0x08, 0x04, 0x04, 0x08          } // 72 r
  ,{
    0x48, 0x54, 0x54, 0x54, 0x20          } // 73 s
  ,{
    0x04, 0x3f, 0x44, 0x40, 0x20          } // 74 t
  ,{
    0x3c, 0x40, 0x40, 0x20, 0x7c          } // 75 u
  ,{
    0x1c, 0x20, 0x40, 0x20, 0x1c          } // 76 v
  ,{
    0x3c, 0x40, 0x30, 0x40, 0x3c          } // 77 w
  ,{
    0x44, 0x28, 0x10, 0x28, 0x44          } // 78 x
  ,{
    0x0c, 0x50, 0x50, 0x50, 0x3c          } // 79 y
  ,{
    0x44, 0x64, 0x54, 0x4c, 0x44          } // 7a z
  ,{
    0x00, 0x08, 0x36, 0x41, 0x00          } // 7b {
  ,{
    0x00, 0x00, 0x7f, 0x00, 0x00          } // 7c |
  ,{
    0x00, 0x41, 0x36, 0x08, 0x00          } // 7d }
  ,{
    0x10, 0x08, 0x08, 0x10, 0x08          } // 7e ←
  ,{
    0x78, 0x46, 0x41, 0x46, 0x78          } // 7f →
};
unsigned dayInMonth[] = {
  31,28,31,30,31,30,31,31,30,31,30,31};
unsigned char second, minute, hour, day, month, year;


#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{  
  clock_inc();    //Tinh toan thoi gian
  LcdClear();      // Dong nay dung de hien thi gia tri ra LCD
  gotoXY(0,0);
  LcdString("Bay gio la: ");
  LcdCharacter(hour/10 + '0');
  LcdCharacter(hour%10 + '0');
  LcdCharacter(':');
  LcdCharacter(minute/10 + '0');
  LcdCharacter(minute%10 + '0');
  LcdCharacter(':');
  LcdCharacter(second/10 + '0');
  LcdCharacter(second%10 + '0');

}
void setup(){
  Serial.begin(9600);
  LcdInitialise();
  LcdClear();

  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer. This line of code is needed at the beginning of most MSP430 projects. 
  // This line of code turns off the watchdog timer, which can reset the device after a certain period of time.
  BCSCTL1 |= DIVA_3;	// ACLK/8
  BCSCTL3 |= XCAP_3;	//12.5pF cap- setting for 32768Hz crystal
  P1DIR |= 0x01;        // P1DIR is a register that configures the direction (DIR) of a port pin as an output or an input.
  P1OUT |= BIT0;	// P1.0 low

  CCTL0 = CCIE;	// CCR0 interrupt enabled
  CCR0 = 512;	// 512 -> 1 sec, 30720 -> 1 min
  TACTL = TASSEL_1 + ID_3 + MC_1;	// ACLK, /8, upmode
}
void loop(){
}

void clock_inc(){
  second ++;
  if(second>=60){
    second =0;
    minute ++;
    if(minute >=60){
      minute =0;
      hour ++;
      if(hour >=24){
        hour=0;
        day ++;
        if(day > dayInMonth[month]){
          day = 0;
          month++;          
          if(month>12){
            month = 0;
            year++;
          }
        }
      }
    }
  }
}

void LcdWrite(byte dc, byte data)
{
  digitalWrite(PIN_DC, dc);
  digitalWrite(PIN_SCE, LOW);
  shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
  digitalWrite(PIN_SCE, HIGH);
}

void gotoXY(int x, int y) {
  LcdWrite(0, 0x80 | x);  // Column.
  LcdWrite(0, 0x40 | y);  // Row.  ?
}

void LcdClear(void)
{
  for (int index = 0; index < LCD_X * LCD_Y / 8; index++)
  {
    LcdWrite(LCD_D, 0x00);
  }
}

void LcdCharacter(char character)
{
  LcdWrite(LCD_D, 0x00);
  for (int index = 0; index < 5; index++)
  {
    LcdWrite(LCD_D, ASCII[character - 0x20][index]);
  }
  LcdWrite(LCD_D, 0x00);
}

void LcdString(char *characters)
{
  while (*characters)
  {
    LcdCharacter(*characters++);
  }
}

void LcdInitialise(void)
{
  pinMode(PIN_SCE, OUTPUT);
  pinMode(PIN_RESET, OUTPUT);
  pinMode(PIN_DC, OUTPUT);
  pinMode(PIN_SDIN, OUTPUT);
  pinMode(PIN_SCLK, OUTPUT);
  digitalWrite(PIN_RESET, LOW);
  digitalWrite(PIN_RESET, HIGH);
  LcdWrite(LCD_C, 0x21 );  // LCD Extended Commands.
  LcdWrite(LCD_C, 0xba );  // Set LCD Vop (Contrast). 
  LcdWrite(LCD_C, 0x04 );  // Set Temp coefficent. //0x04
  LcdWrite(LCD_C, 0x14 );  // LCD bias mode 1:48. //0x13
  LcdWrite(LCD_C, 0x0C );  // LCD in normal mode.
  LcdWrite(LCD_C, 0x20 );
  LcdWrite(LCD_C, 0x0C );
}



